/**
 * @brief   : 基于Timoshenko 梁函数法的厚薄通用三角形板（不包含膜部分）单元
 * @version : 0.1
 * @author  : wanghuan
 * @date    : 2024.11.07
 * @copyright Copyright (c) 2024 by 神工仿真, All Rights Reserved.
 */

#pragma once
#include "Utility/Algebra/Matrix.h"
#include "DataStructure/Common/Out.h"

#include "SGFem/Integration/IntegrationFormula/Gauss2DTria3P.h"
#include "SGFem/ShellSecCalculator/ShellSectionParser1.h"
#include "../Common/PublicElementExport.h"

/**
 * @brief   : 基于Timoshenko 梁函数法的厚薄通用三角形板
 * @author  : wanghuan
 * @date    : 2024.11.07
 */
class PublicElement_DECLSPEC TmTPlateCalculator
{
  public:

    void Initialize () {};
    
    /**
     * @brief   : 单元初始化，计算和积分点无关的数据
     * @param   : localCoord  单元局部坐标系下节点坐标
     * @param   : SecConstant 单元局部坐标系下的 材料刚度
     * @author  : wanghuan
     * @date    : 2024.11.07
     */
    void SetCoordinate (const SG::Algebra::Matrix&                  localCoord,
                        const SG::FEMSolver::Element::ShellSectionProp1& SecConstant);

    /**
     * @brief   : 积分点处的 应变矩阵
     * @param   : iGauss     积分点索引，使用 -1 计算单点积分； 0-2 为三点积分
     * @param   : localCoord 单元局部坐标
     * @param   : Bs         剪切部分应变矩阵
     * @param   : Bb         弯曲部分应变矩阵
     * @param   : detj       积分点处行列式的值
     * @author  : wanghuan
     * @date    : 2024.11.07
     */
    void ComputeB (int                                    iGauss,
                   const SG::Algebra::Matrix& localCoord,
                   SG::Algebra::Matrix&       Bs,
                   SG::Algebra::Matrix&       Bb,
                   SG::DataStructure::Common::Real&       detj) const;

    /**  @brief 计算单元刚度矩阵
     * @param [in] coord   节点局部坐标
     * @param [in] thickness 节点处壳厚度值
     * @param [in] SecConstant  截面属性，需要用到膜部分材料刚度 Cm, 厚度 t 以及 剪切模量 G
     */
    SG::Algebra::Matrix ComputeStiffness (const SG::Algebra::Matrix&                  coord,
                                                      const SG::DataStructure::Common::Real* const            thickness,
                                                      const SG::FEMSolver::Element::ShellSectionProp1& SecConstant) const;

  private:
    SG::Algebra::Matrix       m_oneOverSquareL;
    SG::Algebra::Matrix       m_Bb0;
    SG::Algebra::Matrix       m_DELTA;
    SG::Algebra::Matrix       m_DELTA1;
    SG::Algebra::Matrix       m_G;
    SG::FEMSolver::Element::Gauss2DTria3P m_integForm;  ///< 积分格式
};